﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Modelo;
using SIGEB.Prototipo.Control;
using SIGEB.Modelo.moduloDocumentos;
using SIGEB.Prototipo.control;

namespace SIGEB.Prototipo.Vista.moduloDocumentos
{
    public partial class frm_busquedaReservas : frm_Base
    {
      
        #region "constructores"

        public frm_busquedaReservas(LinkedList<reserva> datosActuales, objetoReturn retorno, controlPrincipal cp)
            : base(cp)
        {
            InitializeComponent();
            asignarUI(this.Controls);
            this.retorno = retorno;
            this.datosActuales = datosActuales;
            mostrarReservas(datosActuales);
            rbt_codigo.Checked = true;
            if (retorno == null)
            {
                throw new Exception("Necesita asignar un retorno");
            }
            this.retorno = retorno;
        }

        #endregion

        #region "eventos"


        private void rbt_nombre_CheckedChanged(object sender, EventArgs e)
        {
            limpiarCampos();
            actualizarCampos();
        }

        private void dgv_usuarios_SelectionChanged(object sender, EventArgs e)
        {
            actualizarActual();
        }

        private void dgv_usuarios_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            devolverSeleccionado();
        }

        private void rbt_titulo_CheckedChanged(object sender, EventArgs e)
        {
            limpiarCampos();
            actualizarCampos();
        }

        private void rbt_autor_CheckedChanged(object sender, EventArgs e)
        {
            limpiarCampos();
            actualizarCampos();
        }

        private void rbt_id_CheckedChanged(object sender, EventArgs e)
        {
            limpiarCampos();
            actualizarCampos();
        }

        private void txt_titulo_TextChanged(object sender, EventArgs e)
        {
            if (rbt_codigo.Checked && Validacion.LongitudCadenaValida(txt_codigo.Text, true, 20))
            {
                mostrarReservas(buscarCodigo(datosActuales, txt_codigo.Text));
            }
            else
            {
                mostrarReservas(datosActuales);
            }
        }

        private void txt_autor_TextChanged(object sender, EventArgs e)
        {
            if (rbt_usuario.Checked && Validacion.LongitudCadenaValida(txt_usuario.Text, true, 100))
            {
                mostrarReservas(buscarUsuario(datosActuales, txt_usuario.Text));
            }
            else
            {
                mostrarReservas(datosActuales);
            }
        }

        private void dgv_doc_SelectionChanged(object sender, EventArgs e)
        {
            actual = capturaSeleccion();
        }

        private void btn_seleccionar_Click_1(object sender, EventArgs e)
        {
            devolverSeleccionado();
        }

        private void btn_cancelar_Click_1(object sender, EventArgs e)
        {
            this.Close();
        }

        private void dgv_doc_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            devolverSeleccionado();
        }

        private void frm_busquedaReservas_TextChanged(object sender, EventArgs e)
        {
            if (rbt_fecha.Checked)
            {
                mostrarReservas(buscarFecha(datosActuales, dtp_fecha.Value));
            }
            else
            {
                mostrarReservas(datosActuales);
            }
        }

        #endregion

        #region "metodos"

        private void limpiarCampos()
        {
            txt_usuario.Text = txt_codigo.Text = "";
            dtp_fecha.Value = DateTime.Today;
        }

        private void actualizarCampos()
        {
            txt_codigo.Enabled = rbt_codigo.Checked;
            txt_usuario.Enabled = rbt_usuario.Checked;
            dtp_fecha.Enabled = rbt_fecha.Checked;
        }

        private void mostrarReservas(LinkedList<reserva> documentos)
        {
            llenarColumnas();
            if (documentos != null)
            {
                foreach (reserva actual in documentos)
                {
                    dgv_doc.Rows.Add(actual.idReserva, actual.solicitud, actual.idUsuario, actual.idDocumento);
                }
            }
        }

        private void llenarColumnas()
        {
            dgv_doc.Columns.Clear();
            dgv_doc.Columns.Add("Cod Solicitud", "Cod Solicitud");
            dgv_doc.Columns.Add("Fecha Solicitud", "Fecha Solicitud");
            dgv_doc.Columns.Add("ID Usuario", "ID Usuario");
            dgv_doc.Columns.Add("ID Documento", "ID Documento");
        }

        private void actualizarActual()
        {
            actual = cp.datos.reservas.obtenerreserva(getFromDgv());
        }

        private string getFromDgv()
        {
            try
            {
                dgv_doc.Rows[dgv_doc.SelectedCells[0].RowIndex].Selected = true;
                String code = dgv_doc.SelectedRows[0].Cells[0].Value.ToString();
                return code;
            }
            catch
            {
                return null;
            }
        }

        private reserva capturaSeleccion()
        {
            reserva nuevo = null;
            try
            {
                dgv_doc.Rows[dgv_doc.SelectedCells[0].RowIndex].Selected = true;
                String codigo = dgv_doc.SelectedRows[0].Cells[0].Value.ToString();
                if (codigo != null)
                {
                    nuevo = getReserva(codigo);
                }
            }
            catch
            {

            }
            return nuevo;
        }

        private reserva getReserva(string codigo)
        {
            foreach (reserva actual in datosActuales)
            {
                if (actual.idReserva == codigo)
                {
                    return actual;
                }
            }
            return null;
        }

        private void devolverSeleccionado()
        {
            if (actual != null)
            {
                retorno.objeto = actual.idReserva;
                this.Close();
            }
            else
            {
                MessageBox.Show("Debe escoger un documento");
            }
        }

        private LinkedList<reserva> buscarCodigo(LinkedList<reserva> documentos, string codigo)
        {
            LinkedList<reserva> lista = new LinkedList<reserva>();
            if (documentos != null)
            {
                foreach (reserva act in documentos)
                {
                    if (act.idReserva == codigo)
                    {
                        lista.AddLast(act);
                        return lista;
                    }
                }
            }
            return lista;
        }

        private LinkedList<reserva> buscarUsuario(LinkedList<reserva> documentos, string codigo)
        {
            LinkedList<reserva> lista = new LinkedList<reserva>();
            if (documentos != null)
            {
                foreach (reserva act in documentos)
                {
                    if (act.idUsuario == codigo)
                    {
                        lista.AddLast(act);
                        return lista;
                    }
                }
            }
            return lista;
        }

        private LinkedList<reserva> buscarFecha(LinkedList<reserva> documentos, DateTime fecha)
        {
            LinkedList<reserva> lista = new LinkedList<reserva>();
            if (documentos != null)
            {
                foreach (reserva act in documentos)
                {
                    if (act.solicitud == fecha)
                    {
                        lista.AddLast(act);
                        return lista;
                    }
                }
            }
            return lista;
        }

        #endregion

        #region "metodos botones"

        private void btn_seleccionar_Click(object sender, EventArgs e)
        {
            devolverSeleccionado();
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        #endregion

        #region "atributos"

        objetoReturn retorno;

        controlReservas cr;
        reserva actual;
        LinkedList<reserva> datosActuales;
        private LinkedList<reserva> datosReservas;


        #endregion

    }
}
